# _*_conding:cp-1252-*-
# 教育机构：银杰教育
# 讲师：李伟
# 开发时间：2025/8/31 上午2:02
"""
函数封装步骤：
1、功能代码写出来
2、def封装
3、参数化： 变化的数据定义为形参
4、返回值： 判断函数是否有数据需要给调用的人使用

封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志
2、断言失败了，异常捕获：如果断言失败了，记录error日志，然后raise 异常错误 用例失败。

3、因为有些用例可能没有在用例里写断言，不需要断言，在函数做判空处理。

"""
import allure
import json
import pytest
import json
from jsonpath import jsonpath
from loguru import logger
@allure.step("响应结果断言")
def response_assert(response,expected_result):
    if expected_result is None:
        logger.info("用例不需要做断言！")
        return
    logger.info("----------------断言开始-----------------------")
    expected_result = json.loads(expected_result)  #从Excel读取出来的json串需要反序列化 转换python可以识别的字典格式。
    logger.info(f"期望结果是：{expected_result}")
    for k,v in expected_result.items():
        if k.startswith("$"):
            actual_data = jsonpath(response.json(),k)[0]  #提取响应接口的结果值。已经是字典格式了，不需要再次反序列化，否则会报错。
            logger.info(f"执行结果是：{actual_data}")
            try:
                assert actual_data == v
                logger.info("断言成功，用例通过！")
            except AssertionError as e:   #需要抛出异常，否则无法记录日志统计。
                logger.error("断言失败，用例不通过！")
                raise e
        elif k == "text":
            actual_data = response.text     # 异常用例格式是这样的expected_result = '{"text":"账号或密码不正确"}'
            logger.info(f"执行结果是：{actual_data}")
            try:
                assert actual_data == v   # assert actual_data响应结构判断是否是 "账号或密码不正确"
                logger.info("断言成功，用例通过！")
            except AssertionError as e:
                logger.error("断言失败，用例不通过！")
                raise e









